YS電子工作ラボ

<PIC32MZリファレンス>
MPLAB Harmony
 汎用I/Oポート入出力制御


汎用I/Oポートの使い方 
  特に周辺モジュール(Peripheral Module)の設定をしなければ、I/Oポートは汎用I/Oポートとしてつかえる状態になっています。 汎用I/Oポートを制御する要領は他のPICと全く同じです。

 ハーモニーのライブラリ関数をつかった汎用I/Oポートの制御を以下の例(プロジェクト名: 11 Sw Led OnOff noINT)で説明します。  LATGbits.LATG15 = 1;といったレジスタ操作命令も使用可能で動作しますがここでは、(長くて使いにくい関数ですが)ハーモニーのライブラリ関数を使って説明します。 ( → 汎用I/Oポート制御でよく使う関数
 尚、ハーモニーのライブラリ関数はMPLAB Harmony Helpに全ライブラリが詳しく記載されています。 MPLAB Harmony Helpは Harmonyをインストールするとdocフォルダに保存されています。  たとえば Harmony v.2.0 betaの場合は、以下のフォルダに保存されています。
"C:\microchip\harmony\v2_00b\doc\help_harmony.pdf"
  プロジェクト名: 11 Sw Led OnOff noINT
<仕様>
① スイッチSWを押してONにすると押している間、LEDは点灯する。
② スイッチから手を放しSWをOFFにするとLEDは消灯する。
③ スイッチはモーメンタリースイッチとする。
④ スイッチのチャタリング対策は行わないものとする。
⑤ OSCはFRC(内臓 8MHz高速発振器)を使用する。

<回路図>
  <解説> 
 MHCのPortsSettingテーブルによるポートの初期設定は行わないものとします。また、OSCに関する設定はデフォルト(OSC::内臓高速RC発振器8MHz、システムクロック:200MHz)とします。この場合、MHCで生成したコードに追加するコードは、以下の7行です。
      PLIB_PORTS_PinDirectionInputSet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0);       //RB0を入力モードにする。
      PLIB_PORTS_ChangeNoticePullUpPerPortEnable(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0);//RB0にプルアップ抵抗設定
      PLIB_PORTS_PinModeSelect(PORTS_ID_0, PORTS_ANALOG_PIN_0, PORTS_PIN_MODE_DIGITAL);   //RB0/AN0ポートをデジタルモードに設定
      PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 );   //RG15を出力モードにする。

      if(PLIB_PORTS_PinGet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0) == 0)             //RB0の入力が0の場合
PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 ); //RG15にHighを出力する。 else PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 ); //RG15にLowを出力する


      ・ 1行目のPLIB_PORTS_PinDirectionInputSetが、ピンRB0を入力モードに設定する関数です。TRISBbits.TRISB0 = 1; と
          同じ処理がおこなわれます。
      ・ 2行目のPLIB_PORTS_ChangeNoticePullUpPerPortEnableは、RB0ピンにプルアップ抵抗を設定する関数です。CNPUBbits.CNPUB0 = 1;と
          同じ処理が行われます。
      ・ 3行目のPLIB_PORTS_PinModeSelectは、ピンRB0/AN0をデジタルピンとしてつかうかアナログピンとして使うかを選択する関数で、ここでは
          デジタルピンモードとして使うことを選択しています。デフォルトではアナログピンが選択されていますのでデジタルピンとしてつかう場合は
          この設定は必須となります。
      ・ 4行目のPLIB_PORTS_PinDirectionOutputSetは、ピンRG15を出力モードに設定する関数です。TRISGbits.TRISG15 = 0; と
          同じ処理が行われます。
      ・ 5行目のPLIB_PORTS_PinGetは、ピンRB0の入力を検出する関数です。戻り値が検出値です。PORTBbits.RB0に相当する処理が行われます。
      ・ 6行目のPLIB_PORTS_PinSetは、ピンRG15の出力をHighに設定する関数です。LATGbits.LATG15 = 1; と同じ処理が行われます。
      ・ 7行目のPLIB_PORTS_PinClearは、ピンRG15の出力をLowに設定する関数です。LATGbits.LATG15 = 0; と同じ処理が行われます。
       1行目~4行目のポートの初期設定部分は、実際のプロジェクトファイルの中にあるsys_ports_static.cのSYS_PORTS_Initialize()の中に
      記載するのがハーモニー流のプログラムの書き方です。SYS_PORTS_Initialize( )の中にはMHCがユーザが作成するPinsettingsのテーブル(注)等に
      もとづき生成するコードが記述されるようになっています。
       5行目~7行目の実行処理コード部分はハーモニー流のプログラムの書き方では、app.cの中にあるAPP_Tasks( )に中に書くのが一般的です。
      (注)Pinsettingsのテーブルでは、ピンを入力モードと出力モードのどちらでつかうか、プルアップ抵抗を使うか使わないか、変化割り込みを
            使うか使わないかなど ピンに関するいろいろな設定ができます。
   <回路図>(→回路図のPDFファイル
PIC32MZ2048EFH100をつかった場合の回路図を以下に示します

  

  外観・動作結果> (→ 動画
 ターゲットボードの外観写真を以下に記載します。
  (画像をクリックすると プログラム動作中の動画がYouTubeで再生します)
         
     
ディスクリートキバン

(PIC32MZ QFPモジュール組立キット → 購入方法
(QFPモジュール用ユニバーサルキバン → 購入方法

 PIC32MZ評価ボード
(MZ100-A001)

( → 購入方法 )
動作結果の
   動画再生
    




 プロジェクト作成手順("011 Sw Led OnOff")
         (→ プロジェクトファイル(Harmony v.2.04版)ダウンロード)
  (注) PIC32MZ評価ボード(MZ100-A001)でも動作します。

・ 作成手順
  はじめてHarmonyの プロジェクトをつくる方も対象に、プロジェクト作成要領について説明します。 
  (1) Harmony プロジェクト選択
    MPLABXのメニューバーで[File]→[New Project]とすると 下図の[New Project]ダイアログが開きます。[Categories]の[Microchip Embedded]を選んだあと [Projects]の[32bit-MPLAB Harmony Project]を選択して[Next]をクリックします。
     
  (2)  プロジェクトフォルダの作成
  C:\microchip\harmony\v2_04\appsフォルダに下にプロジェクトフォルダをつくります。 これ以外のところにプロジェクトフォルダをつくるとコンパイルできなくなることがあります。 今回だけでなく後々他にもたくさんHarmonyのプロジェクトをつくことになるのでここではC:\microchip\harmony\v2_04\apps\_WK\Study204\Basic204フォルダの下にプロジェクトフォルダをつくります。
     
  (3)  プロジェクト名、デバイス名 
    ここではプロジェクト名を"011 Sw Led OnOff"として、Project Nameに記入します。使用するデバイス名としてPIC32MZ2048EFH100を選択して [Finish]をクリックします。
     
   (4) プロジェクト画面の表示 
    プロジェクト全体の画面があらわれます。 
   
  (5)  プロジェクトのプロパティ設定
    プロジェクトを右クリックしてドロップダウンリストの中から[Properties]を選択します。
   
  (6)  コンパイラの設定
    Project Propertiesのダイアログが開きます。特に理由がなければXC32の最新のコンパイラを選択します。
     
  (7)  シフトJIS選択 
    Categoriesボックスの[General]を選択して、 Encodiongのコンボボックスから[Shift-JIS]を選択します。
   
  (8)   MHCの表示
    右のボックスにMHC(MPLAB Harmony Configurator)の画面が表示されていない場合は、 メニューバーから[Tools] → [Embedded] → [MPLAB Harmony Configurator]をクリックするとMHCの画面が現れます。 
 尚、MHC画面を表示するには左側のプロジェクトWinodowでMHCを開きたいプロジェクトをドロップダウンリストで main project に設定しておく必要があります。
   
  (9)  ポート設定
     MHCのPin Settingsのタブをクリックして、ポート機能の設定を行います。
RG15のポートでLEDをON/OFFするので Function欄のドロップダウンリストからGPIO_OUTをクリックして設定します。
また、RB0のポートではスイッチからの信号を入力するので、GPIO_INを選択します。 更に、RB0ポートに関してはプルアップ抵抗を設定するのでプルアップ欄のチェックボックス□にチェックを入れます。
   
  (10)  プロジェクト コードの生成
     このプロジェクトでは、MHCはすべてデフォルトのままでよいのでプロジェクトファイルを一式生成します。下図の画面で、(Generate Code)ボタンをクリックして、*.hや*.cなどのプロジェクトに関連するファイルを一括で作成(生成)します。
Generateボタンをクリックしてプロジェクトファイルを一式生成します。
   
  (11)   app.cファイルへの追記
     プロジェクトファイルツリーの Source Files\app\app.cファイルを開き void APP_Tasks(void)の部分を表示します。
case APP_STATE_SERVICE_TASKS:の中に下記コードを記載します。 
 ハーモニーの関数だけでなく PIC32MZのレジスタへの直接操作命令も使用できます。
     
            if(PLIB_PORTS_PinGet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0) == 0)     //RB0の入力が0の場合
                PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 );      //RG15にHighを出力する。
            else PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 );   //RG15にLowを出力する
 
/*                   
            if(PORTBbits.RB0 == 0)          //RB0の入力がLowの場合
                LATGbits.LATG15 = 1;        //RG15の出力をHighにする。
            else  LATGbits.LATG15 = 0;      //RB0の入力がHigh以外の場合、RG15の出力をLowにする。
*/     

 

以下、app.c (青字が上記の追加部分です)
     
     
  (12)  プロジェクトのクリーンビルド
    プロジェクトのクリーンとビルドを行う。
   
  (13) 
ボタンをクリックして、実行ファイルをデバイスに書き込みます
   
     

  
     <参考>
  何らかの理由により、MHCのPin Settingsのテーブルを使用しない場合、 下記の太字コードを app.cの APP_Initialize ( )関数に書き込んで、ポートの設定を行うこともできます。
     
void APP_Initialize ( void )
{
    PLIB_PORTS_PinDirectionInputSet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0);           //RB0を入力モードにする。
    PLIB_PORTS_ChangeNoticePullUpPerPortEnable(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_0);//RB0にプルアップ抵抗設定
    PLIB_PORTS_PinModeSelect(PORTS_ID_0, PORTS_ANALOG_PIN_0, PORTS_PIN_MODE_DIGITAL);   //RB0/AN0ポートをデジタルモードに設定
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, PORTS_BIT_POS_15 );   //RG15を出力モードにする
   
/*
TRISBbits.TRISB0 = 1; //RB0を入力モードにする。 CNPUBbits.CNPUB0 = 1; //RB0にプルアップ抵抗設定 ANSELBbits.ANSB0 = 0; //SWポート:RB0/AN0 デジタルモード TRISGbits.TRISG15 = 0; //RG15を出力モードにする。
*/
}